Die Integration von Facebook Login in AngularJS App mit Satellizer
7. Januar 2016 Kommentare zur Integration von Facebook Login in AngularJS App Off mit Satellizer 226 Aufrufe
<Script src = "bower_components / Winkel / angular.min.js"> </ script> <script src = "bower_components / Winkel-ui-Router / frei nach oben / Winkel-ui-router.min.js"> </ script > <script src = "main.js"> </ script> Unten ist der Code, die in primary.js müssen Routing zu konfigurieren:
var app = angular.module ( 'DemoApp' [ 'ui.router']); app.config (function ($ stateProvider, $ urlRouterProvider) $ stateProvider .state ( "Wohnort", URL: '/ Residenz', templateUrl: 'partials / house.tpl.html') .state ( "geheim", URL: ' / secret ', templateUrl:' partials / secret.tpl.html ') .state (' login ', uRL:' / login ', templateUrl:' partials / login.tpl.html '); $ urlRouterProvider.in andere Fall ( '/ home');); An diesem Punkt in dem Fall, dass Sie den Server Python app.py ausführen, sollten Sie diese gemeinsame Schnittstelle zumin
Die Hyperlinks Residenz, Login und Geheimnis muss auf dieser Ebene arbeiten und den Inhalt Material der entsprechenden Vorlagen zu vermitteln.
Glückwunsch, du fertig einfach in das Skelett setzen! für diejenigen, die auf jeden Fehler kommen, überprüfen Sie bitte den Code auf GitHub
Schritt 2: Anmeldung und Registrierung
am Ende dieses Schrittes, haben Sie eine Webapp, die Sie könnten die Verwendung von E-Mail und Passwort registrieren / einloggen.
Der erste Schritt ist das Backend zu konfigurieren. wir würden ein Consumer-Modell gefällt und eine Strategie der JWT-Token für eine bestimmte Person zu erzeugen. Die Person, Version unter bewiesen ist tatsächlich vereinfacht und nicht durchführt nicht einmal mehr alle gängigen Prüfungen ähnlich wie wenn Container E-Mail bietet Platz für "@", oder wenn Container Passwort beherbergt als mindestens 6 Zeichen, und so weiter.
Typ Person (db.edition): Identifizierung = db.Column (db.Integer, primary_key = echte) e mail = db.Column (db.String (hundert), nullable = False) password = db.Column (db.String (hundert)) def Token (Selbst-): Nutzlast = 'sub': self.id, 'iat': DateTime.UtcNow () 'exp': DateTime.UtcNow () Timedelta (Tage = 14) token = jwt .encode (Nutzlast, app.config [ 'TOKEN_SECRET']) return token.decode ( 'unicode_escape')
Wir verwenden das jwt Modul in Python die Nutzlast Phase in JWT zu erzeugen. Die iat und exp Teil entsprechen dem Zeitstempel, der erstellt Token ist und abgelaufen. In diesem Code wird der Token in 2 Wochen abgelaufen sein.
Nachdem die Variation Benutzer einmal erstellt wurde, können wir den "Login" und "Register" Endpunkte hinzuzufügen. Der Code für beide sind ziemlich identisch, so hier werde ich nur das "Register" Phase aufweisen. Bitte beachten Sie, dass standardmäßig unter Verwendung Satellizer die Endpunkte / Auth / Loginname wird und / Auth / Anmeldungen für den "Login" und "Register" bezeichnet.
@ App.route ( '/ Auth / Anmeldungen', Methoden = [ 'POST']) def Anmeldungen (): data = request.json email = Wissen [ "Email"] password = Wissen [ "password"] user = Person ( e mail = E-Mail, Passwort = Passwort) db.session.add (Benutzer) db.session.commit () return jsonify (Token = user.token ())
Lassen Sie uns den Endpunkt die Verwendung von curl ersten Test:
curl localhost: 5000 / Auth / Anmeldungen -H "Content-Type: application / json" -X -d submit ' "E-Mail": "werfen Sie einen Blick at@abcd.com", "Passwort": "xyz"'
das Ergebnis sollte so scheinen:
"Token": "sehr lange Zeichenfolge ...."
Nun, da der wieder-Finish-Abschnitt ist fertig, lassen Sie uns den Eingang-End-Angriff! Zuerst wollen wir Satellizer und fügen Sie es als eine Abhängigkeit in major.js zu installieren:
Bower installieren Satellizer --retailer
In Satellizer als Abhängigkeit:
var app = angular.module ( 'DemoApp' [ 'ui.router', 'Satellizer']);
Einloggen und Anmeldungen in Satellizer ist in der Tat ziemlich einfach im Vergleich zu den gesamten Aufbau, es sei denn jetzt:
() $ Auth .signup $ scope.signUp = ausführen (E-Mail: $ scope.electronic Mail, Passwort: $ scope.password) .dann (function (Antwort) // das Token Set gekauft von Server $ auth.setToken (Antwort ); // gehen auf geheime Webseite $ state.go ( "geheim");) .seize (function (Antwort) console.log ( "Fehlerreaktion", Reaktion););
wenn im Fall, dass Sie ein Problem an Ort und Stelle setzen Sie den Code, dass Sie den Code auf GitHub überprüfen konnte.
Schritt #three aber geheime Ansicht sollte nicht in der Tat geheim sein, weil jede einzelne Es reicht!
sicher, das ist richtig! außer jetzt kann jede Person, um geheime Webseite gehen, ohne sich anzumelden.
Es ist Zeit, um einige Abfangjäger in AngularJS hinzufügen, um sicherzustellen, dass, wenn eine Person auf geheime Webseite geht und wenn dieser Verbraucher nicht angemeldet werden sollen, werden sie auf der Login-Seite umgeleitet werden.
Erstens müssen wir ein Flag requiredLogin zu unterscheiden geheimen Web-Seite von verschiedenen diejenigen hinzufügen.
.state ( "geheim", URL: '/ secret', templateUrl: 'partials / secret.tpl.html' Regler: 'SecretCtrl', Informationen: requiredLogin: Ist)
Die "Information" Phase wird wahrscheinlich innerhalb der $ stateChangeStart Ereignis verwendet werden, die jedesmal, wenn die Routing-Änderungen ausgelöst wird:
app.run (führen ($ rootScope, $ Zustand, $ auth) $ rootScope $ auf ( '$ stateChangeStart', führen (Abenteuer, toState) var requiredLogin = false;. // überprüfen, ob dieser Zustand anmelden wollen, wenn (toState.data && toState.knowledge.requiredLogin) requiredLogin = tatsächliche; // wenn ja, und wenn diese Verbraucher sind noch nicht angemeldet ist, leiten Sie ihn zur Login-Seite if (requiredLogin && $ auth.isAuthenticated (!)) Event.preventDefault (); $ state.go ( 'login');););
Nun kann die Person gehen nicht in einem Augenblick auf den Schlüssel Seite mit in der Anmeldung. Hooray!
Wie gewöhnlich, wird der Code für diesen Schritt auch hier entdeckt werden.
Schritt #four: Es ist Zeit, eine Sache in der Tat Geheimnis zu bekommen!
An dieser zweiten, gibt es nichts in der Tat Geheimnis in der geheimen Webseite. Lassen Sie uns es eine Sache privat setzen.
Dieser Schritt beginnt mit der in der Back-Oberfläche wachsenden einen Endpunkt verwendet, die einfachste, erhältlich für einen authentifizierten Verbraucher, das entspricht einem legitimen Token zu haben. Der Endpunkt / user unten gibt die user_id und E-Mail der Person, ähnlich dem Token.
@ App.route ( '/ user') def user_info (): # das Token, wenn nicht mehr request.headers.get im Authorization-Header gesetzt wird ( 'Authorization'): return jsonify (Fehler = 'Authorization-Header fehlt'), 401 # dieser Header sieht wie folgt aus: "Authorization: Inhaber Token" Token = request.headers.get ( 'Authorization') zerschneiden () [1] versuchen:. Nutzlast = jwt.decode (Token, app.config [ ' TOKEN_SECRET ']) außer DecodeError: return jsonify (Fehler =' Ungültige token '), 401 mit Ausnahme ExpiredSignature: return jsonify (Fehler =' abgelaufen token '), 401 anderes: user_id = Nutzlast [' sub '] user = Verbraucher. question.filter_by (id = Benutzer-ID) .First (), wenn der Verbraucher ist None: return jsonify (error = 'müssen nun nicht passieren ... "), 500 Rückkehr jsonify (id = person.identity, E-Mail = Verbraucher .E Mail), 200 Rückkehr jsonify (error = "keineswegs erreichen hier ..."), 500
wieder, wir nutzen das Modul jwt das JWT Token in der "Genehmigung" Header integriert zu entschlüsseln und den Fall zu behandeln, wenn das Token oder jetzt abgelaufen ist nicht gültig.
Lassen Sie uns an diesem Endpunkt die Verwendung von curl einen Blick. Zunächst wollen wir einen Sound-Token zu erhalten:
curl localhost: 5000 / Auth / Anmeldungen -H "content-Art: utility / json" -X -d veröffentlichen ' "E-Mail": "test@abcd.com", "Passwort": "xyz"'
Dann mit diesem Token:
curl localhost: 5000 / Person -H "Authorization: Inhaber das Token setzen hier"
Das macht den Folge:
"E-Mail": "check@abcd.com", "id": 1
Jetzt müssen wir diesen Endpunkt innerhalb des geheimen Controller zu umarmen. Dies ist relativ einfach, da wir einfach den Endpunkt der Verwendung des gemeinsamen $ http Modul anrufen müssen. Das Token wird an den Header durch Satellizer mechanisch eingesetzt, so brauchen wir nicht zu Ärger mit allen wichtigen Punkten von den Token zu speichern und sie dann in der rechten Kopfschuss.
getUserInfo (); betreiben getUserInfo () $ http.get ( '/ Person') .dann (betreiben (Antwort) $ scope.person = response.data;) .trap (function (Antwort) console.log ( "getUserInfo Fehler", Reaktion); )
Schließlich haben wir jetzt etwas tatsächlich persönlich in der geheimen Seite!
Der Code dieses Schrittes ist auf GitHub.
Schritt # 5: Facebook Login mit Satellizer
eine nette Sache über Satellizer, wie zu Beginn erwähnt, ist es macht soziale Login Lasten einfacher zu integrieren. am Ende dieses Schrittes können Benutzer anmelden ihre Facebook-Konto!
Erste, was zu tun ist, eine Anwendung auf fb Entwickler Seite in dem Bemühen, schaffen eine application_id und einen geheimen Code zu haben. Bitte folgen Sie developers.fb.com/doctors/apps/register eine Facebook-Entwickler-Konto für diejenigen zu schaffen, die man nicht haben bereits und eine Webseite App erstellen. Danach, gehen Sie unter die Anwendung von Identität und Utility-Geheimnis, wie im Screenshot zu haben.
sobald der Verbraucher mit fb zu verbinden wählt, Satellizer wird einen Autorisierungscode an den Endpunkt / Auth / Facebook senden. Mit diesem Berechtigungscode kann die Back-End ein get Eintrag abrufen von fb / oauth Endpunkt Token, das den Aufruf erlaubt, Graph API fb Verbraucherinformation verwandt Bereich zu bekommen, user_friends, Person E-Mail, und viele andere.
Wir wollen zusätzlich den Überblick zu erhalten, ob ein Benutzerkonto mit Facebook erstellt oder über gemeinsame Anmeldungen. dies zu tun, fügen wir unserer User-Version facebook_id.
facebook_id = db.Column (db.String (hundert))
Die Facebook-Geheimnis über env Variablen konfiguriert FACEBOOK_SECRET, dass wir zu app.config hinzufügen.
app.config [ 'FACEBOOK_SECRET'] = os.environ.get ( 'FACEBOOK_SECRET')
so dass Sie die app.py starten können, werden Sie diese env Variable gesetzt haben:
FACEBOOK_SECRET = Ihr Geheimnis Python app.py
Hier ist die Taktik, die Facebook-Anmeldungen behandelt. mit Hilfe von Standard Satellizer den Endpunkt / Auth / facebook nennen.
@ App.route ( '/ Auth / facebook', Methoden = [ 'POST']) def auth_facebook (): access_token_url = 'graph_api_url =' params = 'client_id': request.json [ 'clientId'], 'redirect_uri': request.json [ 'redirectUri'], 'client_secret': app.config [ 'FACEBOOK_SECRET'], 'Code': request.json [ 'code'] # Austauschautorisierungscode für die Zulassung zu bekommen, um Token. r = requests.get (access_token_url, params = params) # Verwendung json.loads als Ersatz von urlparse.parse_qsl access_token = json.hundreds (r.textual Inhalt) # Schritt 2. Details abrufen über den aktuellen Benutzer. r = requests.get (graph_api_url, params = access_token) Profil = json.masses (r.textual Inhalt) # Schritt drei. Erstellen Sie eine Marke neues Konto oder geben eine gegenwärtige. . User = user.question.filter_by (facebook_id = Profil [ 'id']) erste (), wenn der Benutzer: return jsonify (Token = consumer.token ()) u = user (facebook_id = Profil [ 'id'], email = Profil [ 'E-Mail'])db.session.add (u) db.session.commit () return jsonify (Token = u.token ())
Um eine Anfrage an den fb Server versenden, verwenden wir das auf die Hand Modul Anfragen. Jetzt ist der harte Abschnitt auf der wieder-Finish ist getan. An der Eingangsende, fb Login Hinzufügen ist ziemlich einfach. Erstens müssen wir unsere Satellizer facebook_id mit Hilfe der Zugabe von diesen Code in app.config zu informieren arbeiten:
$ AuthProvider.fb (clientId: Ihre fb App Identifikation, // standardmäßig die Umleitung URI ist redirectUri: ');
Um die Nutzung von Facebook anmelden, können wir rufen Sie einfach an:
$ Auth.authenticate ( "Facebook")
Wie üblich, mit dem Sie einen Blick auf den Code auf GitHub nehmen könnte
Zu diesem Zeitpunkt ist die Webapp Leistung voll im Zusammenhang. Der Verbraucher kann die Verwendung von normalen E-Mail und Passwort oder über einloggen / registrieren facebook zu verwenden. Wenn Sie angemeldet sind, kann der Benutzer seine geheime Seite.
Machen Sie eine attraktive Schnittstelle
Die Schnittstelle sollte nicht sehr schön sein an dieser Stelle, also lassen Sie uns für das Format und die Winkel Toaster Modul mit einer Fehlermeldung ein bisschen etwas von Bootstrap hinzufügen effektiv zu behandeln, entsprechend, wenn die Anmeldung fehlschlägt.
Der Code für diese Verschönerungs Abschnitt finden Sie hier.
Schlussfolgerung
dieser Artikel Präsentationen eine Schritt-Weg-Schritt-Integration von Satellizer in einer (einfachen) AngularJS Webapp. Mit Satellizer, werden wir einfach andere soziale Logins erinnert an Twitter, Linkedin und mehr hinzuzufügen. Der Code auf der Eintrittsende ist relativ die gleiche wie in dem Artikel. dann wieder, ändert sich die Back-End als soziales Netzwerk SDKs verschiedene Endpunkte mit völlig unterschiedlichen Protokollen. dass Sie einen Blick auf dem enthält Beispiele für fb, Github, Google, Linkedin, Twiter und Bitbucket nehmen konnte. Wenn Sie unsicher sind, müssen Sie die Dokumentation Check-out